#include<iostream>
#include<string>
using namespace std;

/*继承和派生
1.基类/超类/父类    派生类/子类
2.单继承 多继承 ---> (取决于父类的个数)
3.继承关系的写法:  class 子类:访问控制权限 父类{};
  a. public ---> 公有继承
  b. private ---> 私有继承
  c. protected ---> 保护继承
  d. 私有 < 保护 < 公有
4.构造和析构 调用顺序
  a.先调用父类构造，后调用子类构造
  b.先调用子类析构，后调用父类析构
5.访问控制权限
  a.子类中的成员函数对父类成员的访问；
  b.主函数中子类对象对父类成员的访问。

【注】!!!子类可以拥有父类所有的属性，除了构造!!!
      因此子类调用父类的构造函数时，要在子类构造函数的参数后加 :父类(父类构造函数的参数)
      即 子类(参数):父类(父类构造函数的参数){函数体}
*/

/*class Birth{
	int year;
	int month;
public:
	Birth(int y, int m)
	{
		year = y;
		month = m;
		cout<<"birth"<<endl;
	}
	void Dshow()
	{
		cout<<"出生年月："<<year<<"年"<<month<<"月"<<endl;
	}
};

class Person //父类
{
private:
	string name;
protected:
	int age;
public:
	Person(string n, int a){
		name = n;
		age = a;
	    cout << "构造Person" << endl;
	}
	void Pshow(){
		cout << "姓名：" << name << "  " << "年龄：" << age << "  ";
	}
	~Person(){cout << "析构Person" << endl;}
};

class Stu:public Person //子类（Person派生[共有派生]出Stu；Stu继承于Person。）
{
	string ID;
	double score;
public:
	Stu(string n, int a, string id, double s):Person(n, a) //Person后括号中参数的顺序要与父类构造函数中参数的顺序一致
	{
		ID = id;
		score = s;
		cout << "构造Stu" << endl;
	}
	void Sshow(){
      //cout << name << "  ";  ---> 私有的成员不能出父类的大括号
	    cout << "年龄：" << age << "  "; //---> 保护的成员可以出父类的大括号，但是只能被子类使用
		Pshow();             //---> 公有的成员可以出父类的大括号
		cout << "学号：" << ID << "  " << "成绩：" << score << endl;
	}
	~Stu(){cout << "析构Stu" << endl;}
};

class Tea:public Person
{
	int wage;
public:
	Tea(string n, int a, int w):Person(n, a)
	{
		wage = w;
	}
	void Tshow(){
		Pshow();
		cout << "工资：" << wage << endl;
	}
};

int main()
{
	Stu s1("zhangsan", 24, "1001", 78.33);
	s1.Sshow();
	
  //s1.name; ---> name为私有成员，在派生类对象访问时无法访问
  //s1.age; ---> age为保护成员，在派生类对象访问时无法访问
	s1.Pshow(); //---> Pshow函数为公有成员，在派生类对象访问时可以访问
	
	return 0;
}*/
